package game.java3D;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import java.awt.PopupMenu;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.LineArray;
import javax.media.j3d.Material;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class GrandeOurse3DJava3D extends Applet implements MouseListener,
		MouseMotionListener {

	private Canvas3D c;
	private float dz = -8.0F;
	private Vector3d eta = new Vector3d(2.6782868, 0.95249915, -10.211735 + 8);
	private Vector3d miz = new Vector3d(1.3972227, 0.11056229, -7.9981213 + 8);
	private Vector3d dze = new Vector3d(1.3814067, 0.11733321, -8.1529656 + 8);
	private Vector3d eps = new Vector3d(0.70122137, 0.080953359, -7.6173640 + 8);
	private Vector3d del = new Vector3d(0.0, 0.0, -8.04 + 8);
	private Vector3d gam = new Vector3d(-0.8883190, 0.82615963, -15.251831 + 8);
	private Vector3d alp = new Vector3d(-1.4533803, -1.0239428, -9.6983930 + 8);
	private Vector3d bet = new Vector3d(-1.2871224, -0.10782208, -7.1645021 + 8);
	private Point3d[] pts = new Point3d[14];
	private Color3f[] couls = new Color3f[14];
	private LineArray la;

	public BranchGroup createSceneGraph(SimpleUniverse u) {

		BranchGroup objRoot = new BranchGroup();
		BoundingSphere largeBounds;
		largeBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
		BoundingSphere smallBounds;
		smallBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 0.4);
		{
			Vector3f ldir = new Vector3f(1.0F, 1.0F, -1.0F);
			Color3f lcouldl = new Color3f(1.0F, 1.0F, 1.0F);
			DirectionalLight dl = new DirectionalLight(lcouldl, ldir);
			dl.setInfluencingBounds(largeBounds);
			objRoot.addChild(dl);
		}
		{
			Color3f lcoulal = new Color3f(0.2F, 0.2F, 0.1F);
			AmbientLight al = new AmbientLight(lcoulal);
			al.setInfluencingBounds(largeBounds);
			objRoot.addChild(al);
		}
		TransformGroup objTrans = new TransformGroup();
		objRoot.addChild(objTrans);
		Transform3D t = new Transform3D();
		t.setTranslation(new Vector3d(0.0F, 0.0F, -8.0F));
		objTrans.setTransform(t);
		TransformGroup objTr2 = new TransformGroup();
		objTrans.addChild(objTr2);
		Transform3D tt = new Transform3D();
		objTr2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		objTr2.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		objTr2.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
		objTr2.setTransform(tt);
		Appearance a = new Appearance();
		Material m = new Material();
		m.setDiffuseColor(1.0f, 1.0f, 1.0f);
		m.setSpecularColor(1.0f, 1.0f, 1.0f);
		m.setAmbientColor(1.0f, 1.0f, 1.0f);
		m.setShininess(25.0f);
		a.setMaterial(m);
		{
			TransformGroup objTran = new TransformGroup();
			objTr2.addChild(objTran);
			Transform3D t1 = new Transform3D();
			t1.setTranslation(eta);
			objTran.setTransform(t1);
			objTran.addChild(new Sphere(0.12F, a));
		}
		{
			TransformGroup objTran = new TransformGroup();
			objTr2.addChild(objTran);
			Transform3D t1 = new Transform3D();
			t1.setTranslation(miz);
			objTran.setTransform(t1);
			objTran.addChild(new Sphere(0.12F, a));
		}
		{
			TransformGroup objTran = new TransformGroup();
			objTr2.addChild(objTran);
			Transform3D t1 = new Transform3D();
			t1.setTranslation(dze);
			objTran.setTransform(t1);
			objTran.addChild(new Sphere(0.12F, a));
		}
		{
			TransformGroup objTran = new TransformGroup();
			objTr2.addChild(objTran);
			Transform3D t1 = new Transform3D();
			t1.setTranslation(eps);
			objTran.setTransform(t1);
			objTran.addChild(new Sphere(0.12F, a));
		}
		{
			TransformGroup objTran = new TransformGroup();
			objTr2.addChild(objTran);
			Transform3D t1 = new Transform3D();
			t1.setTranslation(del);
			objTran.setTransform(t1);
			objTran.addChild(new Sphere(0.12F, a));
		}
		{
			TransformGroup objTran = new TransformGroup();
			objTr2.addChild(objTran);
			Transform3D t1 = new Transform3D();
			t1.setTranslation(gam);
			objTran.setTransform(t1);
			objTran.addChild(new Sphere(0.12F, a));
		}
		{
			TransformGroup objTran = new TransformGroup();
			objTr2.addChild(objTran);
			Transform3D t1 = new Transform3D();
			t1.setTranslation(alp);
			objTran.setTransform(t1);
			objTran.addChild(new Sphere(0.12F, a));
		}
		{
			TransformGroup objTran = new TransformGroup();
			objTr2.addChild(objTran);
			Transform3D t1 = new Transform3D();
			t1.setTranslation(bet);
			objTran.setTransform(t1);
			objTran.addChild(new Sphere(0.12F, a));
		}
		{
			pts[0] = new Point3d(2.6782868, 0.95249915, -10.211735 + 8);
			pts[1] = new Point3d(1.3814067, 0.11733321, -8.1529656 + 8);
			pts[2] = new Point3d(1.3814067, 0.11733321, -8.1529656 + 8);
			pts[3] = new Point3d(0.70122137, 0.080953359, -7.6173640 + 8);
			pts[4] = new Point3d(0.70122137, 0.080953359, -7.6173640 + 8);
			pts[5] = new Point3d(0.0, 0.0, -8.04 + 8);
			pts[6] = new Point3d(0.0, 0.0, -8.04 + 8);
			pts[7] = new Point3d(-0.8883190, 0.82615963, -15.251831 + 8);
			pts[8] = new Point3d(0.0, 0.0, -8.04 + 8);
			pts[9] = new Point3d(-1.4533803, -1.0239428, -9.6983930 + 8);
			pts[10] = new Point3d(-1.4533803, -1.0239428, -9.6983930 + 8);
			pts[11] = new Point3d(-1.2871224, -0.10782208, -7.1645021 + 8);
			pts[12] = new Point3d(-1.2871224, -0.10782208, -7.1645021 + 8);
			pts[13] = new Point3d(-0.8883190, 0.82615963, -15.251831 + 8);
			couls[0] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[1] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[2] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[3] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[4] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[5] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[6] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[7] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[8] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[9] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[10] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[11] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[12] = new Color3f(1.0f, 1.0f, 1.0f);
			couls[13] = new Color3f(1.0f, 1.0f, 1.0f);
			la = new LineArray(14, LineArray.COORDINATES | LineArray.COLOR_3);
			la.setCoordinates(0, pts);
			la.setColors(0, couls);
			Shape3D shape = new Shape3D(la, a);
			shape.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
			objTr2.addChild(shape);
		}
		BoundingSphere bounds;
		bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
		MouseRotate behavior = new MouseRotate(objTr2);
		objTr2.addChild(behavior);
		behavior.setSchedulingBounds(bounds);
		MouseZoom behavior2 = new MouseZoom(objTr2);
		objTr2.addChild(behavior2);
		behavior2.setSchedulingBounds(bounds);
		objRoot.compile();
		return objRoot;
	}

	public GrandeOurse3DJava3D() {
		setLayout(new BorderLayout());
		GraphicsConfiguration config = SimpleUniverse
				.getPreferredConfiguration();
		c = new Canvas3D(config);
		add("Center", c);
		SimpleUniverse u = new SimpleUniverse(c);
		BranchGroup scene = createSceneGraph(u);
		u.getViewingPlatform().setNominalViewingTransform();
		u.addBranchGraph(scene);
	}

	public void mouseDragged(MouseEvent e) {
	}

	public void mouseMoved(MouseEvent e) {
	}

	public void mouseClicked(MouseEvent e) {
	}

	public void mouseEntered(MouseEvent e) {
		int x = e.getX();
		int y = e.getY();
		System.out.println(x + " " + y);
		PopupMenu pm = new PopupMenu("Hello");
		c.add(pm);
		pm.show(c, x, y);
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mousePressed(MouseEvent e) {
		int x = e.getX();
		int y = e.getY();
		System.out.println(x + " " + y);
		PopupMenu pm = new PopupMenu("Hello");
		c.add(pm);
		pm.show(c, x, y);
	}

	public void mouseReleased(MouseEvent e) {
	}

	public static void main(String[] args) {
		new MainFrame(new GrandeOurse3DJava3D(), 256, 256);
	}
}